#筛选 Where-Object
Where-Object 用于从管道中筛选对象,只有使条件表达式为真的对象才会继续传递到下游。
#语法形式
#脚本块形式
脚本块使用 { } 包裹,$_(或 $PSItem)表示当前管道对象:
命令 | Where-Object { 条件表达式 }
例如筛选 CPU 时间大于 10 秒的进程:
> Get-Process | Where-Object { $_.CPU -gt 10 }
#简化形式
简化形式直接指定属性、比较运算符和值:
> Get-Process | Where-Object -Property CPU -GT 10
也可以省略 -Property:
> Get-Process | Where-Object CPU -GT 10
简化形式适合单个属性、单个条件的简单筛选。
#常用比较运算符
| 运算符 | 说明 |
|---|---|
-eq / -ne | 等于 / 不等于 |
-gt / -ge | 大于 / 大于等于 |
-lt / -le | 小于 / 小于等于 |
-like / -notlike | 通配符匹配 / 不匹配 |
-match / -notmatch | 正则表达式匹配 / 不匹配 |
-contains / -notcontains | 集合包含 / 不包含某个值 |
-in / -notin | 值是否在集合中 |
#示例
按文件扩展名筛选:
> Get-ChildItem -File | Where-Object { $_.Extension -eq '.ps1' }
按文件大小筛选,1MB 是 PowerShell 支持的数值后缀:
> Get-ChildItem -File | Where-Object -Property Length -GT 1MB
按名称通配符筛选:
> Get-ChildItem | Where-Object { $_.Name -like '*.md' }
使用 -and 组合多个条件:
> Get-Process | Where-Object { $_.CPU -gt 10 -and $_.WorkingSet64 -gt 100MB }
使用 -or 满足任一条件即可:
> Get-Process | Where-Object { $_.ProcessName -eq 'pwsh' -or $_.ProcessName -eq 'code' }
使用 -not 取反:
> Get-ChildItem -File | Where-Object { -not ($_.Extension -eq '.tmp') }
#注意事项
- 字符串比较默认不区分大小写;需要区分时使用
-ceq、-clike等带c前缀的运算符。 $_只在脚本块内有效,表示当前正在处理的对象。- 比较对象属性前,必要时先确认属性是否存在,避免意外的
$null比较。